"""
python read_json_write_xlsx.py
"""

import json
import os
from openpyxl import Workbook, load_workbook

ANS_PATH = "../fujian/p2/deap_genetic_4t/best_ever/best_ever_solution.json"
OUTPUT_DIR = "../fujian"
OUTPUT_FILENAME = "result.xlsx"

def load_warehouse_mapping(json_path=ANS_PATH):
    """
    从给定的 JSON 文件读取数据，并返回包含 cid 和 wid 的字典数组。

    :param json_path: JSON 文件的路径
    :return: 一个包含字典的列表，每个字典有 'cid' 和 'wid' 字段
    """
    if not os.path.exists(json_path):
        raise FileNotFoundError(f"JSON 文件不存在: {json_path}")

    with open(json_path, 'r') as f:
        data = json.load(f)

    # 将读取的数据转换为包含 'cid' 和 'wid' 的字典数组
    result = [{"cid": item["category_id"], "wid": item["warehouse_id"]} for item in data]
    
    return result

def write_to_excel(output_dir=OUTPUT_DIR, output_filename=OUTPUT_FILENAME):
    """
    将字典数组写入 Excel 文件的指定工作表。

    :param output_dir: 输出 Excel 文件的文件夹路径
    :param output_filename: 输出 Excel 文件的文件名
    """
    
    # 创建输出文件夹，如果不存在
    os.makedirs(output_dir, exist_ok=True)
    output_path = os.path.join(output_dir, output_filename)

    # 加载字典数组数据
    data = load_warehouse_mapping()
    
    # 检查输出文件是否存在，若存在则加载，否则创建新的工作簿
    if os.path.exists(output_path):
        wb = load_workbook(output_path)
    else:
        wb = Workbook()

    # 选择或创建工作表
    if "1c1w" in wb.sheetnames:
        ws = wb["1c1w"]
    else:
        ws = wb.create_sheet("1c1w")

    # 在第一行第二列输出单词 "warehouse"
    ws.cell(row=1, column=2, value="warehouse")

    # 按照 cid 升序排序
    sorted_data = sorted(data, key=lambda x: x["cid"])

    # 将数据写入 Excel，注意行和列从 1 开始
    for entry in sorted_data:
        cid = entry["cid"]
        wid = entry["wid"]
        
        # 在第 (cid + 2) 行，第 2 列写入 wid
        print("row = {}, column = {}".format(cid + 2, 2))
        ws.cell(row=cid + 2, column=2, value=wid + 1)

        # 在第 (cid + 2) 行，第 1 列输出 "category{i-1}"
        ws.cell(row=cid + 2, column=1, value=f"category{cid + 1}")

    # 保存工作簿
    wb.save(output_path)
    print(f"数据已成功写入到 {output_path} 的 '1c1w' 工作表中.")

# 示例用法
if __name__ == '__main__':
    write_to_excel()  # 不传递任何参数
